<html>
    <head>
        <title>设置值提供程序</title>
    </head>
    <body>
        <script>
            /*
                    三、设置值提供程序

                            设置系统是可扩展的，你可以通过定义设置值提供程序来扩展它，以从任何来源并基于任何条件获取设置值。

                            ISettingProvider使用设置值提供者来获取设置值。

                            如果值提供者无法获取设置值，它会回退到下一个值提供者。


                            1、预构建设置值提供程序

                                    ★、有5个预建设置值提供程序按以下顺序注册：、

                                                ①、DefaultValueSettingValueProvider：从设置定义的默认值中获取值（如果已设置）（请参阅上面的设置定义部分）。

                                                ②、ConfigurationSettingValueProvider：从IConfiguration服务获取值（如果已设置）。

                                                ②、GlobalSettingValueProvider：获取设置的全局（系统范围）值（如果已设置）。

                                                ④、TenantSettingValueProvider：获取当前租户的设置值（如果已设置）（请参阅多租户文档）。

                                                ⑤、UserSettingValueProvider：获取当前用户的设置值（如果已设置）（请参阅当前用户文档）。

                                    设置后备系统从底部（用户）到顶部（默认）工作。

                                    全局、租户和用户设置值提供者使用ISettingStore从数据源读取值（请参阅下面的部分）。


                            2、在应用程序配置系统Configuration中配置设置值
                                            
                                    如上一节所述，ConfigurationSettingValueProvider从IConfiguration服务中读取设置，

                                    默认情况下，该服务可以从appsettings.json中读取值。

                                    因此，配置设置值以在appsettings.json文件中定义它们的最简单方法。

                                    eg:你可以配置IEmailSender设置，如下所示：

                                         {
                                            "Settings": {
                                                "Abp.Mailing.DefaultFromAddress": "noreply@mydomain.com",
                                                "Abp.Mailing.DefaultFromDisplayName": "My Application",
                                                "Abp.Mailing.Smtp.Host": "mail.mydomain.com",
                                                "Abp.Mailing.Smtp.Port": "547",
                                                "Abp.Mailing.Smtp.UserName": "myusername",
                                                "Abp.Mailing.Smtp.Password": "mySecretPassW00rd",
                                                "Abp.Mailing.Smtp.EnableSsl": "True"
                                            }
                                        }   
                                            
                                    设置值应在Settings部分下配置，如本例所示。

                                    IConfiguration是一个. NET Core服务，它不仅可以从appsettings.json中读取值，还可以从环境、用户机密…等中读取值。有关详细信息，请参阅Microsoft的文档：
                                    
                                             https://learn.microsoft.com/en-us/aspnet/core/fundamentals/configuration/?view=aspnetcore-9.0           
                                            

                                    ★、在Configuration系统中加密设置：

                                            当设置定义的IsEncrypted属性设置为true时，你必须使用ISettingEncryptionService来加密设置值，这意味着设置值应该在appsettings.json中加密。

                                            将ISettingEncryptionService注入类并加密纯文本的示例：

                                                    public class MyService
                                                    {
                                                        private readonly ISettingEncryptionService _encryptionService;

                                                        public MyService(ISettingEncryptionService encryptionService)
                                                        {
                                                            _encryptionService = encryptionService;
                                                        }

                                                        public void EncryptValue(string plainText)
                                                        {
                                                            var ciphertext = _encryptionService.Encrypt(plainText); // 对设置值中文本进行加密
                                                        }
                                                    } 
                                                        
                                            然后将 ENCRYPTED_VALUE_HERE 替换为 ISettingEncryptionService.Encrypt 加密后的密文。

                                                    {
                                                        "Settings": {
                                                            "MySetting": "ENCRYPTED_VALUE_HERE"
                                                        }
                                                    }

                             3、自定义设置值提供程序    Custom Setting Value Providers

                                        如果需要扩展设置系统，可以定义一个从SettingValueProvider类派生的类。
                                        
                                        例子：

                                                // 声明自定义设置提程序
                                                public class CustomSettingValueProvider : SettingValueProvider // 设置提供程序基类
                                                {
                                                    //  重写提供程序名称
                                                    public override string Name => "Custom";

                                                    public CustomSettingValueProvider(ISettingStore settingStore) 
                                                        : base(settingStore)
                                                    {
                                                    }

                                                    // 重写 GetOrNullAsync 方法以提供自定义逻辑来获取设置值。
                                                    public override Task<string> GetOrNullAsync(SettingDefinition setting)
                                                    {
                                                        
                                                    }
                                                }


                                        或者，你可以实现ISettingValueProvider接口。在这种情况下，请记住将其注册到依赖注入。

                                        ★、提供程序名称：
                                                每个提供程序都应该有一个唯一的名称（这里是“自定义”）。内置提供程序使用给定的名称：

                                                        DefaultValueSettingValueProvider："D"。
                                                        
                                                        ConfigurationSettingValueProvider："C"。

                                                        GlobalSettingValueProvider："G"。

                                                        TenantSettingValueProvider："T"

                                                        UserSettingValueProvider："U"

                                                首选单字母名称以减小数据库中的数据大小（每行重复提供者名称）。



                                       定义自定义设置值提供程序后，需要将其显式注册到AbpSettingOptions：

                                                Configure<AbpSettingOptions>(options =>
                                                {
                                                    options.ValueProviders.Add<CustomSettingValueProvider>();
                                                });  

                                                此示例将其添加为最后一项，因此它将是ISettingProvider使用的第一个值提供程序。

                                                你可以将其添加到options.ValueProviders列表中的另一个索引中。

                                
                            4、ISettingStore 设置商店

                                    虽然设置值提供者可以自由使用任何来源来获取设置值，但ISettingStore服务是设置值的默认来源。全局、租户和用户设置值提供者使用它。

                */
        </script>
    </body>
</html>